// import {
// 	checkUpdate,
// 	updateUseModal
// } from '@/uni_modules/uni-upgrade-center-app/utils/check-update.js'

/**
 * WebView通信工具类
 * 用于处理WebView与原生应用之间的通信
 */
class Nano {
	/**
	 * 构造函数
	 * @param {Object} webViewInstance - WebView实例
	 */
	constructor(webViewInstance) {
		this.isDialogVisible = false
		this.webViewInstance = webViewInstance
		this.currentMessage = null
		this.updateInfo = null
		this.messageHandlers = []
	}

	/**
	 * 退出控制函数
	 * 实现双击退出应用的功能
	 * @returns {Function} 返回退出控制函数
	 */
	exitControl() {
		let exitClickCount = 0
		let exitTimer = null
		const _this = this
		return function() {
			if (_this.isDialogVisible == true) {
				_this.emit("addDialog")
				_this.isDialogVisible = false
				return
			}
			exitClickCount++
			if (exitClickCount === 1) plus.nativeUI.toast("再按一次退出应用");
			if (exitClickCount === 2) plus.runtime.quit();
			if (exitTimer) clearTimeout(exitTimer)
			exitTimer = setTimeout(() => {
				exitClickCount = 0
			}, 2000)
		}
	}

	/**
	 * 初始化函数
	 * 设置各种消息处理函数
	 * @param {Array} _init - 需要初始化的功能列表
	 */
	init(_init = null) {
		const _this = this
		// 初始化功能配置数组
		const initArray = [{
				name: 'dialog', // 对话框功能
				pass: () => _this.currentMessage == 'dialog',
				sfn: () => _this.isDialogVisible = true,
				ffn: null,
			},
			{
				name: 'location', // 获取位置功能
				pass: () => _this.currentMessage == 'get_location',
				sfn: () => {
					uni.getLocation({
						type: 'gcj02',
						geocode: true,
						success(e) {
							_this.emit('getLocation', null, e)
						},
						fail(err) {
							_this.emit('getLocation', null, null, err)
						}
					})
				},
				ffn: null,
			},
			{
				name: 'app_update',
				pass: () => _this.currentMessage == 'app_update',
				sfn: () => {
					checkUpdate(_this).then(res => {
						_this.updateInfo = res.result;
					}).catch(err => {})
				},
				ffn: null,
			},
			{
				name: 'app_update',
				pass: () => _this.currentMessage == 'app_evolution',
				sfn: () => {
					updateUseModal(_this.updateInfo)
				},
				ffn: null,
			},
			{
				name: 'web_view_style', // WebView样式设置功能
				pass: () => _this.currentMessage.name == 'web_view_style',
				sfn: () => {
					_this.webViewInstance.setStyle(_this.currentMessage.style)
				},
				ffn: null,
			},
		]

		// 根据初始化参数选择需要初始化的功能
		if (!_init) {
			// 初始化所有功能
			initArray.forEach(item => {
				_this.createMessage(item.pass ? item.pass : () => {}, item.sfn ? item.sfn : () => {}, item.ffn ? item.ffn : () => {})
			})
		} else {
			// 只初始化指定的功能
			const init_selectArray = [...initArray.filter(item => {
				if (_init.includes(item.name)) {
					return item
				}
			})]
			init_selectArray.forEach(item => {
				_this.createMessage(item.pass ? item.pass : () => {}, item.sfn ? item.sfn : () => {}, item.ffn ? item.ffn : () => {})
			})
		}
		_this.webViewInstance.setStyle({
			top: '200px',
			height: '50vh',
			bounce: 'vertical',
			scalable: false,
		})
	}

	/**
	 * 数据格式化处理函数
	 * @param {any} item - 需要格式化的数据
	 * @returns {string} 格式化后的字符串
	 */
	dealWith(item) {
		if (typeof item == 'object') {
			return JSON.stringify(item)
		} else if (typeof item == 'string') {
			return `'${item}'`
		} else {
			return `${item}`
		}
	}

	/**
	 * 向WebView发送消息
	 * @param {string} fnName - 函数名称
	 * @param {any} value - 消息值
	 * @param {...any} args - 额外参数
	 */
	emit(fnName = '', value = '', ...args) {
		const _this = this
		if (typeof value == 'object' && args.length == 0) {
			_this.webViewInstance.evalJS(`${fnName}(${JSON.stringify(value)})`)
		} else if (args.length > 0) {
			const moreValue = _this.dealWith(value) + ',' + args.map(item => _this.dealWith(item)).join(',')
			_this.webViewInstance.evalJS(`${fnName}(${moreValue})`)
		} else {
			_this.webViewInstance.evalJS(`${fnName}(${value})`)
		}
	}

	/**
	 * 创建消息处理函数
	 * @param {Function} passKey - 判断条件函数
	 * @param {Function} callback - 成功回调函数
	 * @param {Function} failCallback - 失败回调函数
	 */
	createMessage(passKey = () => {}, callback = (val) => {}, failCallback = (val) => {}) {
		const _passKey = passKey
		const _callback = callback
		const _failCallback = failCallback
		const _this = this
		this.messageHandlers.push(function() {
			if (_passKey()) {
				_callback(_this.currentMessage)
			} else {
				_failCallback(_this.currentMessage)
			}
		})
	}

	/**
	 * 消息处理函数
	 * @param {Object} _val - 接收到的消息
	 */
	message(_val) {
		this.currentMessage = _val?.detail?.data[0]
		this.messageHandlers.forEach(item => {
			item()
		})
	}
}

export default Nano
